// POJ 1458 -- Common Subsequence, SEERC 2003
// 陈锋
#include <bits/stdc++.h>
const int NN = 1000;
using namespace std;
char s1[NN], s2[NN];
int D[NN][NN];
int main() {
  while (scanf("%s %s", s1, s2) == 2) {
    int L1 = strlen(s1), L2 = strlen(s2);
    memset(D, 0, sizeof(D));
    for (int i = 0; i < L1; i++)
      for (int j = 0; j < L2; j++)
        if (s1[i] == s2[j])  // 相同字符
          D[i + 1][j + 1] = D[i][j] + 1;
        else  // 在两个序列中选择一个删除字符
          D[i + 1][j + 1] = max(D[i][j + 1], D[i + 1][j]);
    printf("%d\n", D[L1][L2]);
  }
  return 0;
}
/*
算法分析请参考: 《入门经典-第2版》 9.4.1一节中 最长公共子序列问题（LCS）
*/
// Accepted 47ms 4256kB 608 G++ 2020-12-26 21:14:23 22233200